import org.junit.Test;

import java.io.*;

import java.io.FileOutputStream;

public class ObjectIo {
    /**IO流-
     *
     */
    @Test
    public void testOOS() throws IOException {
        //1.创建Person对象
        Person p=new Person();
        p.setName("韩美娟");
        //数组--动态数组
        // String[]str={"1","2","3"},静态动态数组
        //String [] str=new String[]{"1"}
        p.setSay(new String[]{"百因必有果,你的报应就是我"});
        System.out.println("打印对象:"+p);

        //对象打输出写出文件 xxx.obj Person.java
        FileOutputStream fos=
                new FileOutputStream("person.java");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)  -理解:写出对象
         * 该方法会将一组"组"字节,在通过其处理的流写出
         *
         * NotSerializableException 没有序列化异常
         * 原因:写出类没有实现序列化接口
         *
         * 写出文件专业术语
         * 1.通过对象输出流将Person类,先转换为一组"组"字节,这个过程将对象序列化
         * 2.将序列化后的字节在通过字节流[低级流]写入文件中
         * [硬盘上]做长久保存,这个过程[数据持久化]
         * 将Person.obj持久化保存硬盘上
         */
        oos.writeObject(p);
        System.out.println("写出成功啦");


    }
    /**
     * ObjectInputStream 对象输入流
     * 序列化:将对象转换为二进制
     * 反序列化:二进制转换为对象
     * readObject() 返回读取的对象[?]
     * 需求:将序列化 person.obj文件 按照对象方式读入
     */

    @Test
    public void  testOIS() throws IOException, ClassNotFoundException {
        //创建低级流
        FileInputStream fis=
                new FileInputStream("person.obj");
        //创建高级流-对象读入
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject() 获取对象[反序列化操作:二进制转换为对象]
        System.out.println( ois.readObject());
        System.out.println("反序列化成功");

    }
}
